package p06_DAO;

import Utils.reflect.ReflectUtils;
import Utils.db.JdbcUtilsStatic;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * 封装了针对数据表的通用操作
 */
public abstract class BaseDAO<T> {
    private Class<T> clazz = null;

    {
        /*// 获取父类的泛型
        Type genericSuperclass = this.getClass().getGenericSuperclass();
        ParameterizedType paramType = (ParameterizedType) genericSuperclass;

        Type[] typeArgs = paramType.getActualTypeArguments(); // 获取父类的泛型参数
        clazz = (Class<T>) typeArgs[0]; // 获取泛型的第一个参数*/
        clazz = (Class<T>) ReflectUtils.getGenericSuperclassParameterizedTypeArgs(this)[0];
    }

    /**
     * 通用的增删改操作
     *
     * @param sql
     * @param conn
     * @param args
     * @return
     * @throws SQLException
     */
    public int modify(String sql, Connection conn, Object... args) throws SQLException {
        return JdbcUtilsStatic.modify(sql, conn, args);
    }

    /**
     * 查询操作
     *
     * @param conn
     * @param sql
     * @param args
     * @return
     */
    public List<T> query(Connection conn, String sql, Object... args) {
        return JdbcUtilsStatic.query(clazz, conn, sql, args);
    }

    /**
     * 用于查询特殊值的方法。比如：select count(*) from ...
     *
     * @param conn
     * @param sql
     * @param args
     * @param <K>
     * @return
     */
    public <K> K getValue(Connection conn, String sql, Object... args) {
        return JdbcUtilsStatic.getValue(conn, sql, args);
    }
}
